package game.util;

public class Verificacao {

	private Verificacao() {
	}

	public static Vitoria verificar(Marc[][] jogo, Marc marcacao) {
		Vitoria vitoria = verificarVerticalmente(jogo, marcacao);
		if (vitoria != null)
			return vitoria;
		vitoria = verificarHorizontalmente(jogo, marcacao);
		if (vitoria != null)
			return vitoria;
		vitoria = verificarDiagonalPrincipal(jogo, marcacao);
		if (vitoria != null)
			return vitoria;
		return verificarDiagonalSecundaria(jogo, marcacao);
	}

	private static Vitoria verificarVerticalmente(Marc[][] jogo, Marc marcacao) {
		for (int i = 0; i < 3; i++) {
			int count = 0;
			Vitoria vitoria = getColuna(i);
			for (int j = 0; j < 3; j++) {
				if (marcacao.equals(jogo[i][j]))
					count++;
				if (count == 3)
					return vitoria;
			}
		}
		return null;
	}

	private static Vitoria verificarHorizontalmente(Marc[][] jogo, Marc marcacao) {
		for (int j = 0; j < 3; j++) {
			int count = 0;
			Vitoria vitoria = getLinha(j);
			for (int i = 0; i < 3; i++) {
				if (marcacao.equals(jogo[i][j]))
					count++;
				if (count == 3)
					return vitoria;
			}
		}
		return null;
	}

	private static Vitoria verificarDiagonalPrincipal(Marc[][] jogo, Marc marcacao) {
		int count = 0;
		for (int i = 0; i < 3; i++) {
			if (marcacao.equals(jogo[i][i]))
				count++;
			if (count == 3)
				return Vitoria.DIAG_PRIN;
		}
		return null;
	}

	private static Vitoria verificarDiagonalSecundaria(Marc[][] jogo, Marc marcacao) {
		int count = 0;
		for (int i = 0; i < 3; i++) {
			for (int j = 2; j >= 0; j--) {
				if (i + j == 2) {
					if (marcacao.equals(jogo[i][j]))
						count++;
					if (count == 3)
						return Vitoria.DIAG_SECU;
				}
			}
		}
		return null;
	}

	private static Vitoria getLinha(int linha) {
		if (linha == 0)
			return Vitoria.LINHA1;
		else if (linha == 1)
			return Vitoria.LINHA2;
		else
			return Vitoria.LINHA3;
	}

	private static Vitoria getColuna(int coluna) {
		if (coluna == 0)
			return Vitoria.COLUNA1;
		else if (coluna == 1)
			return Vitoria.COLUNA2;
		else
			return Vitoria.COLUNA3;
	}
}
